home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 038a / bas_int1.zip / INT_52.BAS < prev    next >
BASIC Source File  |  1991-06-30  |  3KB  |  84 lines

  1. '=======================================================================
  2. ' Quick Basic Forum
  3. '   Date : 24-Jun-91
  4. '   From : Steve Halko
  5. 'Subject : Re: Function 52h
  6. '              Determining logical drives avaiable
  7. '======================================================================
  8. SUB LogicalDrives
  9.  
  10. 'First get the major DOS version
  11. inreg.ax = &H3000
  12. CALL interruptx(&H21, inreg, outreg)
  13. MajorVersion = outreg.ax AND &HFF
  14.  
  15. 'Now get into the CVT (Configuration Variable Table or DOS List of Lists)
  16. inreg.ax = &H5200
  17. CALL interruptx(&H21, inreg, outreg)
  18. DEF SEG = outreg.es                         'Segement of CVT
  19. PRINT "Number of physical drives = "; PEEK(outreg.bx + &H20)
  20. NrLogDrives = PEEK(outreg.bx + &H21)
  21. PRINT "Number of Logical Drives = "; NrLogDrives
  22. PRINT
  23. REDIM Drives$(NrLogDrives - 1)
  24.  
  25. SELECT CASE MajorVersion
  26.  
  27. 'For DOS Version 2
  28. CASE 2
  29.  
  30.      'Get Segment/Offset of DPB
  31.      DPBSeg = PEEK(outreg.bx + &H2) + 256 * PEEK(outreg.bx + &H3)
  32.      DPBOffset = PEEK(outreg.bx) + 256 * PEEK(outreg.bx + &H1)
  33.  
  34.      'Step through DPB Chain
  35.      NrValidDrives = 0
  36.      DO
  37.           DEF SEG = DPBSeg
  38.           Drives$(NrValidDrives) = CHR$(PEEK(DPBOffset + &H1E))
  39.           NrValidDrives = NrValidDrives + 1
  40.           'Check for last DPB in chain
  41.           IF (PEEK(DPBOffset + &H18) = 255) AND 
  42. _(PEEK(DPBOffset + &H19) = 255) THEN EXIT DO
  43.          
  44.           'If more, then get new DPB Segment/Offset
  45.           DPBSeg = PEEK(DPBOffset + &H1A) + 256 * PEEK(DPBOffset + &H1B)
  46.           DPBOffset = PEEK(DPBOffset + &H18) + 256 * PEEK(DPBOffset + &H19)
  47.      LOOP
  48.  
  49. 'For DOS Versions 3 and 4
  50. CASE 3, 4
  51.  
  52.      'Get Segment/Offset of LDT
  53.      LDTSeg = PEEK(outreg.bx + &H18) + 256& * PEEK(outreg.bx + &H19)
  54.      LDTOffset = PEEK(outreg.bx + &H16) + 256& * PEEK(outreg.bx + &H17)
  55.      DEF SEG = LDTSeg
  56.      NrValidDrives = 0
  57.      IF MajorVersion = 3 THEN
  58.           LDTSize = 81
  59.      ELSE
  60.           LDTSize = 88
  61.      END IF
  62.      'Step through LDT
  63.      FOR i = 0 TO NrLogDrives - 1
  64.          
  65.           'Check for DPB pointer = 0000:0000
  66.           FOR j = &H45 TO &H48
  67.                IF (PEEK(LDTOffset + i * LDTSize + j) <> 0) THEN
  68.                     'If valid drive
  69.                     Drives$(NrValidDrives) = CHR$(i + 65)
  70.                     NrValidDrives = NrValidDrives + 1
  71.                     EXIT FOR
  72.                END IF
  73.           NEXT j
  74.      NEXT i
  75.  
  76. CASE 5
  77.  
  78.      'This section TBD
  79.  
  80. END SELECT
  81.     
  82. END SUB
  83.  
  84.